#include <stdio.h>
#include <stdlib.h>

#include "projectiles.h"

#include "constantes_et_macros.h"



/**
 * \fn void init_projectile(struct projectile* proj, const unsigned int id,
                            const unsigned int puissance, const char orientation,
                            const unsigned int coord_x, const unsigned int coord_y,
                            const char allier)
 * \brief Initialise un projectile
 *
 * \param[out] proj Un pointeur vers le projectile a initialiser
 * \param[in] id L'identifiant du projectile (son indice dans le tableau de
descriptions de projectiles de la base_donnees
 * \param[in] puissance La puissance que l'on souhaite attribuer au projectile
 * \param[in] orientation L'orientation que l'on souhaite attribuer au projectile
 * \param[in] coord_x Coordonnee horizontale a attribuer au projectile
 * \param[in] coord_y Coordonnee verticale a attribuer au projectile
 * \param[in] allier VRAI si le projectile est lance par le joueur, FAUX sinon
 */
static void init_projectile(struct projectile* proj, const unsigned int id,
                            const unsigned int puissance, const char orientation,
                            const unsigned int coord_x, const unsigned int coord_y,
                            const char allier)
{
    proj->coord_x = coord_x;
    proj->coord_y = coord_y;
    proj->id = id;
    proj->orientation = orientation;
    proj->score_deplacement = 0;
    proj->puissance = puissance;
    proj->allier = allier;
}



void init_liste_projectiles(struct liste_projectiles* liste)
{
    liste->prem = NULL;
}



void ajouter_projectile(struct liste_projectiles* liste, const unsigned int id,
                        const unsigned int puissance, const char orientation,
                        const unsigned int coord_x, const unsigned int coord_y,
                        const char allier)
{
    struct projectile* nouveau_projectile;
    struct projectile* temp;

    if(!(nouveau_projectile = (struct projectile*)malloc(sizeof(struct projectile))))
        exit(EXIT_MALLOC);
    if(liste->prem)
    {
        /* cas general (insertion en tete dans liste non-vide) */
        temp = liste->prem;
        liste->prem = nouveau_projectile;
        nouveau_projectile->suiv = temp;
        temp->prec = nouveau_projectile;
        nouveau_projectile->prec = NULL;
    }
    else
    {
        /* cas de la liste vide */
        liste->prem = nouveau_projectile;
        nouveau_projectile->suiv = NULL;
        nouveau_projectile->prec = NULL;
    }
    init_projectile(nouveau_projectile, id, puissance, orientation,
                    coord_x, coord_y, allier);
}





void supprimer_projectile(struct liste_projectiles* liste, struct projectile* proj)
{
    if(proj->prec)
        proj->prec->suiv = proj->suiv;
    else
    {
        /* cas ou l'element a supprimer est le premier de la liste */
        liste->prem = proj->suiv;
    }
    if(proj->suiv)
        proj->suiv->prec = proj->prec;
    free(proj);
}



void detruire_liste_projectiles(struct liste_projectiles* liste)
{
    while(liste->prem)
        supprimer_projectile(liste, liste->prem);
}












